﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDwgDxfInterface.h"
#include "OwnerPtr.h"
#include "IObject.h"
#include "ElementId.h"
#include <map>

namespace gcmp
{
    class IDocument;
    class Coordinate3d;
    struct DxfImporterConfig;

    /// \brief 文件导入选项
    class GCMP_DWG_DXF_INTERFACE_EXPORT IFileImporterOptions : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::IFileImporterOptions, gcmp::IObject)

    public:
        /// \brief 创建文件导入选项实例
        /// \param fileExtensionName 要导入的文件扩展名，扩展名为.dxf(.dwg)则创建ICadFileImporterOptions,扩展名为pdf则创建IPdfFileImporterOptions
        /// \return OwnerPtr<IFileImporterOptions> 返回文件导入选项
        static OwnerPtr<IFileImporterOptions> Create(const std::wstring& fileExtensionName);

        virtual ~IFileImporterOptions() = 0;
    };

    /// \brief CAD文件导入选项
    class GCMP_DWG_DXF_INTERFACE_EXPORT ICadFileImporterOptions : public IFileImporterOptions
    {
        DEFINE_CAST_DERIVED(gcmp::ICadFileImporterOptions, gcmp::IFileImporterOptions)

    public:
        /// \brief 根据指定文档初始化配置文件
        /// \param pDocument 文档
        /// \return 返回是否初始化成功
        virtual bool InitConfig(const IDocument* pDocument) = 0;

        /// \brief 保存文件导入选项配置
        /// \return 返回保存是否成功
        virtual bool SaveConfig() = 0;

        /// \brief 获取文件导入选项配置
        /// \return 返回文件导入选项配置
        virtual const DxfImporterConfig& GetConfig() const = 0;

        /// \brief 重设文件导入选项配置
        /// \return 
        virtual void SetConfig(const DxfImporterConfig& config) = 0;

        /// \brief 是否自动定位
        /// \return 返回是否自动定位
        virtual bool IsAuto() const = 0;

        /// \brief 是否手动（或自动）中心定位
        /// \return 返回是否手动（或自动）中心定位
        virtual bool IsManualCenterOrAutoCentertoCenter() const = 0;

        /// \brief 是否手动（或自动）原点定位
        /// \return 返回是否手动（或自动）原点定位
        virtual bool IsOriginToOrigin() const = 0;

        /// \brief 是否自动中心定位
        /// \return 返回是否自动中心定位
        virtual bool IsAutoCenterToCenter() const = 0 ;

        /// \brief 是否手动中心定位
        /// \return 返回是否手动中心定位
        virtual bool IsManualCenterToCenter() const = 0;

        /// \brief 是否手动原点定位
        /// \return 返回是否手动原点定位
        virtual bool IsManualOriginToOrigin() const = 0;

        /// \brief 回调获取新的全局线型比例;
        /// \param const double dOriginalScale 从dwg中读取的全局线性比例;
        /// \return 新的全局线性比例
        virtual double GetGlobalLineTypeScale(const double dOriginalScale) const = 0;
    public:
        virtual ~ICadFileImporterOptions();
    };

    /// \brief PDF文件导入选项
    class GCMP_DWG_DXF_INTERFACE_EXPORT IPdfFileImporterOptions : public ICadFileImporterOptions
    {
        DEFINE_CAST_DERIVED(gcmp::IPdfFileImporterOptions, gcmp::ICadFileImporterOptions)
    public:
        virtual ~IPdfFileImporterOptions();

        /// \brief 获取要导入的页码
        /// \return uint32_t返回要导入的页码
        virtual uint32_t GetPageNumber() const = 0;

        /// \brief 设置要导入的页码
        /// \param pageNumber 导入的页码
        /// \return 无
        virtual void SetPageNumber(uint32_t pageNumber) = 0;

        /// \brief 获取要导入pdf的缩放比例
        /// \return double 返回pdf缩放比例
        virtual double GetScaling() const = 0;

        /// \brief 设置pdf导入的缩放比例
        /// \param scaling pdf缩放比例，请设置为0.001到1000之间的值
        /// \return 无
        virtual void SetScaling(double scaling) = 0;

        /// \brief 是否导入几何图形
        /// \return bool 返回是否导入几何图形
        virtual bool IsImportVectorGeometry() const = 0;

        /// \brief 设置是否导入几何图形
        /// \param bImportVectorGeometry 是否导入几何图形
        /// \return 无
        virtual void SetImportVectorGeometry(bool bImportVectorGeometry) = 0;
    };
}

